package com.example.educationblockchain.util;

import java.io.UnsupportedEncodingException;

/**
 * 异或加密算法满足如下两个条件时，异或加密算法便是一个安全的加密算法
 * 1. 密钥变更频繁
 * 2. 密钥的长度大于等于明文的长度
 */
public class XORCrypto {
    private byte[] keyBytes; // 密钥
    private int k;

    public static byte[] encrypt(byte[] data, byte[] key) {
        if (data == null || data.length == 0 || key == null || key.length == 0) {
            return data;
        }

        byte[] result = new byte[data.length];

        // 使用密钥字节数组循环加密或解密
        for (int i = 0; i < data.length; i++) {
            // 数据与密钥异或, 再与循环变量的低8位异或（增加复杂度）
            result[i] = (byte) (data[i] ^ key[i % key.length] ^ (i & 0xFF));
        }

        return result;
    }

    public static void main(String[] args) throws UnsupportedEncodingException {
        String content = "Hello world! 你好，世界！";       // 原文内容
        String key = "123四五六";                          // XOR 加密/解密用的原始密码

        // 加密数据, 返回密文
        byte[] cipherBytes = encrypt(content.getBytes("utf-8"), key.getBytes("utf-8"));

        System.out.println(new String(cipherBytes, "utf-8"));

        // 解密数据, 返回明文
        byte[] plainBytes = encrypt(cipherBytes, key.getBytes("utf-8"));

        // 输出解密后的明文: "Hello world! 你好，世界！"
        String plainString = new String(plainBytes, "utf-8");
        System.out.println(plainString);
    }
}